cssnode: Move clear_classes() into the NodeDeclaration
authorBenjamin Otte <otte@redhat.com>
Sat, 12 Sep 2015 00:58:28 +0000 (02:58 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 12 Sep 2015 03:27:35 +0000 (05:27 +0200)
The previous code was crashing when used as the returned classes array
would have been invalid after the first deletion. So if a 2nd class
would be deleted, invalid memory might have been referenced.

gtk/gtkcssnode.c
gtk/gtkcssnodedeclaration.c
gtk/gtkcssnodedeclarationprivate.h

index 9b5db15ad69ff00abf8cbb664ef5d9e24793b55e..4d2563d7ab5e01366ba8bca40c9fe11f0cfcde98 100644 (file)
@@ -1054,14 +1054,10 @@ gtk_css_node_get_junction_sides (GtkCssNode *cssnode)
 static void
 gtk_css_node_clear_classes (GtkCssNode *cssnode)
 {
-  const GQuark *classes;
-  guint n_classes, i;
-
-  classes = gtk_css_node_declaration_get_classes (cssnode->decl, &n_classes);
-
-  for (i = 0; i < n_classes; ++i)
+  if (gtk_css_node_declaration_clear_classes (&cssnode->decl))
     {
-      gtk_css_node_remove_class (cssnode, classes[i]);
+      gtk_css_node_invalidate (cssnode, GTK_CSS_CHANGE_CLASS);
+      g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_CLASSES]);
     }
 }
 
index c16189b1fe33bcffecc721b327e633f28facf2a4..8e425a43871a1c2f47cfa2c5a77e9f946758b05b 100644 (file)
@@ -307,6 +307,21 @@ gtk_css_node_declaration_remove_class (GtkCssNodeDeclaration **decl,
   return TRUE;
 }
 
+gboolean
+gtk_css_node_declaration_clear_classes (GtkCssNodeDeclaration **decl)
+{
+  if ((*decl)->n_classes == 0)
+    return FALSE;
+
+  gtk_css_node_declaration_make_writable_resize (decl,
+                                                 (char *) get_classes (*decl) - (char *) *decl,
+                                                 0,
+                                                 sizeof (GQuark) * (*decl)->n_classes);
+  (*decl)->n_classes = 0;
+
+  return TRUE;
+}
+
 gboolean
 gtk_css_node_declaration_has_class (const GtkCssNodeDeclaration *decl,
                                     GQuark                       class_quark)
index 51c8c62b1fc38a31431a66eb8bae8180c28eee4c..f1499b2a677a653b02d53184b5b9a61e12ad448f 100644 (file)
@@ -45,6 +45,7 @@ gboolean                gtk_css_node_declaration_add_class              (GtkCssN
                                                                          GQuark                         class_quark);
 gboolean                gtk_css_node_declaration_remove_class           (GtkCssNodeDeclaration        **decl,
                                                                          GQuark                         class_quark);
+gboolean                gtk_css_node_declaration_clear_classes          (GtkCssNodeDeclaration        **decl);
 gboolean                gtk_css_node_declaration_has_class              (const GtkCssNodeDeclaration   *decl,
                                                                          GQuark                         class_quark);
 const GQuark *          gtk_css_node_declaration_get_classes            (const GtkCssNodeDeclaration   *decl,